package com.solidumgame.locroninja.juego
{
	import com.solidumgame.locroninja.juego.ingredientes.Ingrediente;
	import com.solidumgame.locroninja.juego.ingredientes.IngredienteCortado;
	import com.solidumgame.locroninja.juego.ingredientes.IngredienteNoCortado;
	import com.solidumgame.locroninja.juego.ingredientes.choclo.Choclo;
	
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.utils.Dictionary;
	
	import libs.away3d.core.stats.Stats;
	import libs.away3d.events.MouseEvent3D;
	import libs.com.greensock.TweenLite;
	import libs.jiglib.collision.CollisionInfo;
	import libs.jiglib.physics.RigidBody;
	import libs.jiglib.plugin.away3d.Away3DPhysics;
	
	
	
	public class Partida extends Sprite
	{
		
		//Stage
		public static var stage:Stage;
		
		//Escenario
		public static var escenario:Escenario;
		
		//UI
		public var ui:UI;
		
		//Fisica
		public static var fisica:Away3DPhysics;
		
		//Ingredientes
		public static var ingredientes:Array;
		public static var ingredientesCortados:Array;
		private var generadorIngredientes:GeneradorIngredientes;
		
		//Olla
		public var olla:Olla;
		
		//Cuchillo
	//	protected static var cuchillo:Cuchillo;
		
		//Variables de juego
		public static var velocidad:Number = 1;
		private static const gravedad:int = 10; 
		
		
		
		
		//Estadisticas
		protected var stats:Stats;
		
		public function Partida(stage:Stage)
		{
			//Stage
			Partida.stage = stage;
			
			stage.frameRate = 60;
			
			//Construimos escenario y lo agregamos a la pantalla, agregamos piso
			
			addChild(new Fondo());
			escenario = new Escenario(stage.stageWidth/2, stage.stageHeight/2);			
			fisica = new Away3DPhysics(escenario,gravedad);
			Partida.fisica.createGround({width:400,height:200}, -240);
			
			addChild(escenario);
			
			escenario.camera.zoom = 1;
			
			//Agregamos la olla
			olla = new Olla();
			olla.agregarOlla();
			
			
			//Agregamos interfaz por encima del escenario
			ui = new UI();
			addChild(ui);
			
			//Borramos puntos
			ingredientes = new Array();
			ingredientesCortados = new Array();
			Puntaje.borrarPuntaje();
			
			//Estadisticas
			//stats = new Stats(escenario,60)
			//addChild(stats);
			//stats.displayStats();

			//Listener de render
			addEventListener(Event.ENTER_FRAME, renderEscenario);
			
			//Creamos generador de ingredientes
			TweenLite.to(escenario.camera,3,{zoom:10, onComplete:generarIngredientes});
			
		}
		
		
		protected function generarIngredientes():void{
			
			generadorIngredientes = new GeneradorIngredientes();
			generadorIngredientes.inicializarTiempo();
			
			//Agregamos "cuchillo"
			MouseTrailer.empezarTrailer();
		}
		
		protected function renderEscenario(e:Event):void{
			
			//Actualizamos estadisticas
			//stats.updateStats(0,null);
			
			if(Puntaje.continuaJuego()){
				
				//Renderizamos y avanzamos en la fisica
				fisica.step();
				escenario.render();
				
				//Control de limites de ingrediente pasado
				for(var i:int = 0; i < ingredientes.length; i ++){
					
					if( ((ingredientes[i] as Ingrediente).modeloFisica.currentState.position.y <= (escenario.limiteVerticalIzquierdo-300)) || !((ingredientes[i] as IngredienteNoCortado).modeloFisica.isActive) ){
						if((ingredientes[i] as Ingrediente).valido)
							Puntaje.incrementarIngredientesValidosPasados();
						else
							Puntaje.incrementarIngredientesNoValidosPasado();
						
						(ingredientes[i] as IngredienteNoCortado).removerIngrediente(i);
						i--;
						if(i<0)
							i = 0;
					}
				}
				
				//Control de limite de ingrediente cortado pasado
				var eliminar:Boolean = false;
				
				for( i = 0; i < ingredientesCortados.length; i ++){
					
					eliminar = false;
					
					//Vemos si colisiona con el piso de la olla
					for(var j:int = 0; j < (ingredientesCortados[i] as IngredienteCortado).modeloFisica.collisions.length; j ++){
						if( (ingredientesCortados[i] as IngredienteCortado).modeloFisica.collisions[j].objInfo.body1.id == olla.pisoFisica.id){
							eliminar = true;
							if((ingredientesCortados[i] as IngredienteCortado).valido)
								Puntaje.incrementarIngredientesCortadosValidos();
							else
								Puntaje.incrementarIngredientesCortadosNoValidos();	
							break;
							
						}
						
					}
					
					
					//Vemos si se excedio
					if( ((ingredientesCortados[i] as IngredienteCortado).modeloFisica.currentState.position.y <= (escenario.limiteVerticalIzquierdo-300)) || eliminar || !((ingredientesCortados[i] as IngredienteCortado).modeloFisica.isActive)  ){
						(ingredientesCortados[i] as Ingrediente).removerIngrediente(i);
						i--;	
						if(i<0)
							i = 0;
						
						
					}
				}
				
				//Cuando no hay ingredientes cortados y no cortados mandamos otra partida
				if(ingredientes.length+ingredientesCortados.length == 0){
					if(generadorIngredientes!=null){
						generadorIngredientes.crearIngredientes();
					}
				}
				
				
				ui.update();
				
			}else{
				removeEventListener(Event.ENTER_FRAME, renderEscenario);
				escenario.render();
				fisica.engine.removeAllBodies();
				escenario.visible = false
				dispatchEvent(new Event("finalizar"));	
				
			}
		}
	}
}